package com.bid.base.common.feign;

import com.alibaba.fastjson.JSONObject;
import com.bid.base.common.util.Stringer;
import com.bid.base.common.util.sm4.Sm4Util;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;

/**
 * <p>
 * <strong>北京正源德标科技信息有限责任公司</strong> <br>
 * </p>
 * <p>
 * 时间: 2021年09月15日 14:26
 * <p>
 * 创建人： zhaots
 * 描述 : TODO
 */
@Slf4j
public class FeignAssistant {

    /**
     * 系统间调用的标识
     */
    public static final String RPC_SERVER = "Rpc-Server";

    /**
     * underscores_in_headers
     * https://blog.csdn.net/u014558668/article/details/79237970
     * 系统间调用的标识 不能用token的场景，调用标识
     * 这个时候用RPC不合适  因为RPC VUE都用
     */
    public static final String RPC_VUE_NOAUTH_KEY = "Authorization-Rpc-Vue";


    //时间间隔毫秒，  先来5分钟吧
    private final static Long timeDf = Long.valueOf(5*60*1000);



    public  static String encryptHeaderValue(String secret,RedissonClient redissonClient, String applicationName) throws Exception {
        if(Stringer.isNullOrEmpty(redissonClient) || Stringer.isNullOrEmpty(applicationName) ){
            throw new RuntimeException("为以后扩展考虑不允许传空");
        }
        return Sm4Util.encryptEcb(secret, String.valueOf(System.currentTimeMillis()));
    }



    /**
     * 本方法用做 对http请求中无参数情况下，指定默认参数做加密解密校验
     *  使用方法及校验规则：
     *      请求方取当前时间戳（毫秒）作为加密参数传递，
     *      接收方接收参数解密，取当前时间戳前后加减2分钟毫秒数，当请求方时间戳在这个范围之内，即校验通过，否则校验失败
     * @author pjy
     * @date 2021/8/17 14:56
     */
    public static boolean noParamCheck(String secretStr, String sm4Httpkey) throws Exception{
        long currentTimeMillisNow = System.currentTimeMillis();
        Long time = Long.valueOf(Sm4Util.decryptEcb(sm4Httpkey, secretStr));
        long currentTimeMillisBefore = currentTimeMillisNow - timeDf;
        long currentTimeMillisAfter = currentTimeMillisNow + timeDf;
        if(time > currentTimeMillisBefore && time < currentTimeMillisAfter){
            log.info("验证通过：secretStr:{} {} {} {}",secretStr,currentTimeMillisBefore,time,currentTimeMillisAfter);
            return true;
        }
        log.warn("验证不通过：{} {} {} {}",secretStr,currentTimeMillisBefore,time,currentTimeMillisAfter);
        return false;
    }

}
